Shader: Grid Traversal
GLSL
code:glsl
/** Result of the gridTraversal3 */
struct GridTraversal3Result {
/** Center of the cell */
vec3 cell;
/** Distance to the bound */
float dist;
/** Normal of the bound */
vec3 normal;
};
GridTraversal3Result gridTraversal3( vec3 ro, vec3 rd, vec3 size ) {
GridTraversal3Result result;
result.cell = floor( ( ro + rd * 1E-3 ) / size + 0.5 ) * size;
vec3 src = -( ro - result.cell ) / rd;
vec3 dst = abs( 0.5 * size / rd );
vec3 bv = src + dst;
result.dist = min( min( bv.x, bv.y ), bv.z );
result.normal = step( bv, vec3( result.dist ) );
return result;
}
レイマーチングでの利用
https://gyazo.com/279c763949c22660c09fff810ddcd9ab
レイマーチング(のfor loop)中に、Grid Traversalを仕込む
Grid端でマーチングを一時停止しながらレイを進めていく
レイマーチングで使うときは、 ro に間違えて ro を入れないように気をつけてね( rp を入れるといいと思う)